package com.cwnu.sw.cys.core.user.controller;


import com.cwnu.sw.cys.core.common.domain.dto.ReqInfo;
import com.cwnu.sw.cys.core.common.domain.vo.resp.ApiResult;
import com.cwnu.sw.cys.core.common.domain.vo.resp.UserInfoResp;
import com.cwnu.sw.cys.core.common.utils.AssertUtil;
import com.cwnu.sw.cys.core.common.utils.RequestHolder;
import com.cwnu.sw.cys.core.user.domain.enums.RoleEnum;
import com.cwnu.sw.cys.core.user.domain.vo.req.BlackReq;
import com.cwnu.sw.cys.core.user.domain.vo.resp.BadgeResp;
import com.cwnu.sw.cys.core.user.domain.vo.req.ModifyNameReq;
import com.cwnu.sw.cys.core.user.domain.vo.req.WaringBadgeReq;
import com.cwnu.sw.cys.core.user.service.RoleService;
import com.cwnu.sw.cys.core.user.service.UserService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * 用户表前端控制器，提供用户相关的API接口。
 *
 * <p>包括获取用户信息、修改用户名、获取徽章、佩戴徽章、拉黑用户等功能。</p>
 *
 * @author jisam
 * @since 2025-02-10
 */
@RestController
@RequestMapping("/capi/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private RoleService roleService;

    /**
     * 测试接口，用于调试和验证系统功能。
     *
     * @return 返回字符串 "test"
     */
    @GetMapping("/test")
    @ApiOperation("测试")
    public String test() {
        if (1 == 1) {
            int i = 1 / 0; // 模拟异常
        }
        ReqInfo reqInfo = RequestHolder.get();
        System.out.println(reqInfo);
        return "test";
    }

    /**
     * 获取当前用户的信息。
     *
     * @return 包含用户信息的 {@link ApiResult} 对象
     */
    @GetMapping("/userInfo")
    @ApiOperation("获取用户信息")
    public ApiResult<UserInfoResp> getUserInfo() {
        Long uid = RequestHolder.get().getUid();
        return ApiResult.success(userService.getUserInfo(uid));
    }

    /**
     * 修改当前用户的用户名。
     *
     * @param req 包含新用户名的请求体
     * @return 操作结果的 {@link ApiResult} 对象
     */
    @PutMapping("/name")
    @ApiOperation("更新用户信息")
    public ApiResult<Void> modifyName(@Valid @RequestBody ModifyNameReq req) {
        Long uid = RequestHolder.get().getUid();
        String newName = req.getName();
        return ApiResult.success(userService.modifyName(uid, newName));
    }

    /**
     * 获取当前用户可选的徽章列表。
     *
     * @return 包含徽章列表的 {@link ApiResult} 对象
     */
    @GetMapping("/badges")
    @ApiOperation("获取可选徽章")
    public ApiResult<List<BadgeResp>> getBadges() {
        Long uid = RequestHolder.get().getUid();
        return ApiResult.success(userService.getBadges(uid));
    }

    /**
     * 佩戴指定徽章。
     *
     * @param req 包含徽章ID的请求体
     * @return 操作结果的 {@link ApiResult} 对象
     */
    @GetMapping("/badge")
    @ApiOperation("佩戴徽章")
    public ApiResult<Void> wearingBadges(@Valid @RequestBody WaringBadgeReq req) {
        Long uid = RequestHolder.get().getUid();
        userService.wearingBadges(uid, req.getItemId());
        return ApiResult.success();
    }

    /**
     * 拉黑指定用户，需要管理员权限。
     *
     * @param req 包含被拉黑用户信息的请求体
     * @return 操作结果的 {@link ApiResult} 对象
     */
    @PutMapping("/black")
    @ApiOperation("拉黑用户")
    public ApiResult<Void> black(@Valid @RequestBody BlackReq req) {
        Long uid = RequestHolder.get().getUid();
        boolean hasPower = roleService.hasPower(uid, RoleEnum.ADMIN);
        AssertUtil.isTrue(hasPower, "没有权限");
        userService.black(req);
        return ApiResult.success();
    }
}

